嗨,大家好!歡迎來到「致 JavaScript 開發者的 Functional Programming 指南」!
在切入到正題前,首先想要跟大家說說自己與 JavaScript 的小故事。
首先,在成為開發者以前,我沒有相關電腦科學的背景,大部分都是透過網路的課程或是官方文件來進行學習。
最一開始我是使用 Vue 作為主要的前端開發框架,學習的方式主要是閱讀 Vue 官方文件,由於 Vue 是一個非常好上手的模板框架,在一開始使用時非常方便,大部分的時候都可以透過官方文件找到適合的語法及工具。
然而隨著自己進到職場,開始要與越來越多人協作,開發專案的規模也越來越大時,自己面臨到所謂「架構」的問題。
當時的我只知道優良的程式碼架構可以解決很多的問題,但卻不知道該從何下手,遇到最具體的問題大概是封裝專案的共用元件。
這些共用元件除了自己以外,也許會有其他的夥伴拿來使用,甚至自己可能在未來也會重複使用到,此時自己遇到了一個非常大的挑戰:「到底元件要怎麼封裝會比較好呢?」
由於當時團隊中並沒有導入明確的協作方式,並且大家對於模組的設計都有自己的一套想法,對於還是前端新手、對技術掌握度不高的我感到非常頭痛。
不曉得大家有沒有類似的經驗?在剛開始撰寫程式碼的時候,如果沒有明確的範例指引,或是某個具體的守則,初階的軟體工程師很容易就在撰寫程式碼的過程失焦,更別提當自己在一個專案中看到多種不同撰寫風格時,管理起來能有多混亂了。
「到底怎麼樣封裝才是好元件?」
這個問題在我下班後依然在腦裡揮之不去,時不時就會透過一些關鍵字查找元件封裝的方式,但依然沒有找到踏實答案的感覺。
後來因緣際會開始使用 React 框架進行開發,這一次我同樣是使用 React 所提供的官方文件來學習,且發現到這兩種框架在文件撰寫上風格大不同。
Vue 官方文件偏向提供「工具的使用方式」,但至於怎麼用比較好、什麼情境下適合使用,在文件上沒有提及太多,然而 React 的學習文件中,都會建議開發者使用怎麼樣的「風格」最適合 React 的開發模式。
此時「Functional Programming 」這個設計典範開始充斥我的開發日常,我發現有了設計典範的指引,我開始能自己思考什麼是「好的程式碼」,也慢慢開始了自己的優化程式碼之路。
如果你跟我一樣也正想優化自己的 JavaScript 程式碼,但不知道要從何下手,也許可以跟我一起投入 Functional Programming 的懷抱!
希望可以透過本系列文章向大家分享 Functional Programming 是多麽美妙的工具,也讓更多使用 JavaScript 的開發者們對於 Functional Programming 有更具體、脈絡化的認識。
在一些技術書籍中,會將 FP 譯作「函式程式設計」或是「功能性程式設計」,為了讓大家可以更直覺的理解這個設計典範,當提及 Functional Programming 時,我們會使用 FP 這個簡寫來取代中譯。
在現代網頁開發的時代,網頁的開發工具非常齊全、也非常多,撇開一些建立在 JavaScrtip 之上的主流框架,更多時候我們還是使用原生的 JavaScript、HTML 及 CSS 進行網頁開發。
我們不需要透過框架,就可以使用 FP 的設計概念進行開發,如果不曉得什麼是設計典範也沒關係,我們後續會針對這兩者的概念進行夠深入的介紹。
在這次的系列內容中,我主要會使用原生的 JavaScript 進行討論,偶爾會使用一些函式庫搭配講解概念,內容大致上會囊括以下有關 FP 的核心概念:
上述這些概念,會將大部分會與 JavaScript 的核心概念或是在瀏覽器上運作的原理有關,所以在系列文章中,也會穿插以下概念,或是說以下的這些概念不理解的話,會很難深刻了解我們實質上要透過 FP 來解決 JavaScript 中的什麼問題,這些概念包含:
透過以上概念的結合,可以更了解為什麼 JavaScript 可以透過採用 FP 解決一些既有問題,以及為什麼我們討論的角度會是以 JavaScript 作為切入點,而不是單純了解 FP 這個設計典範而已。
由於本系列文章是以探討 FP 與如何在 JavaScript 這門語言中實踐 FP ,對於 JavaScript 的核心理論並不會全面囊括,只會大致講到講到與實作 FP 有相關的部分,也不會著重在如何使用 JavaScript 這門語言。
基於以上原因,這篇文章會適合以下類型的人閱讀:
如果目前你對於網頁的實作、開發不熟,甚至不太知道什麼是 AJAX、Web API、JavaScript 等網頁開發的必備技術,那這系列的內容可能會相對生硬,因為我們會需要理解許多生硬的名詞及實務上的技巧。
在這個系列文章中,會穿插程式碼範例、自己針對 FP 額外的思考與實務上的開發應用。
在內文的範例中,會有一些不難但是會需要思考的程式碼,可以的話可以搭配一些線上程式碼編輯器服務:Codepen、JSbin、Babel 等服務,在思考的過程中,搭配實作, 有助於更快了解 JavaScript 及如何在我們的 JavaScript 中導入 FP 這個設計典範。
最後,希望可以用平易近人的角度來帶大家使用 FP,那麼就讓我們開始吧!
functional programming 是一種典範(paragiam)。
設計模式(design pattern) 在不同的典範之下都可以實作。
當然不是每一種設計模式都可以在各種典範之下都可以做出來。
fp 是一種開發典範,就像 oop 一樣。
他可以在不同的程式語言上體現(前提是 function 是該程式語言的一等公民)。
至於實作元件,實作介面而把實作的細節封裝起來才是最重要的。
介面要越一致越穩定最好。
效能跟實作因為已經被封裝了,使用者不一定需要知道實作。
至於不同作者實作的套件,使用者只要選擇喜歡的介面,以及可以接受的效能即可。
非常感謝大大的提醒
自己對設計模式與典範的理解還沒有很深,但內文有多處都有提到「設計模式」,這邊會等有時間把它修正,非常感謝 Q Q
設計模式。design pattern 應該是另一堂課